# 高阶函数
from math import factorial

def high_func(f, arr):
    return [f(x) for x in arr]

def square(n):
    return n ** 2

# 使用python自带数学函数
# print(high_func(factorial, list(range(10))))

# 使用自定义函数
# print(high_func(square, list(range(10))))


# 使用python自带数学函数
# facMap = map(factorial, list(range(10)))
# print(list(facMap))

# 使用自定义函数
# squareMap = map(square, list(range(10)))
# print(list(squareMap))

# TODO map函数传入多个序列
# 匿名函数
# lamMap = map(lambda x: x * 2, list(range(10)))
# print(list(lamMap))
# 传入多个序列
# mutiMap = map(lambda x, y: x + y, list(range(10)), list(range(11, 15)))
# print(list(mutiMap))

from functools import reduce
# result = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
# print(result)
# 设定初始参数：
# TODO 序列数据类型需要和初始参数一致。
# s = reduce(lambda x, y: x + y, ['1', '2', '3', '4', '5'], "数字 = ")
# print(s)

# filter
'''
函数用来过滤序列中不符合条件的值，返回一个迭代器，
该迭代器生成那些函数(项)为 true 的 iterable 项。如果函数为 None，则返回为 true 的项
'''
def boy(n):
    if n % 2 == 0:
        return True
    return False
# 自定义函数
filterList = filter(boy, list(range(20)))

# print(list(filterList))
# print out: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

# 匿名函数
filterList2 = filter(lambda n: n % 2 == 0, list(range(20)))

print(list(filterList2))